/*

构造一个 nn 行 mm 列的矩阵，使得每一个 2×32×3 和 3×23×2 的子矩阵都含有114514。

链接：https://ac.nowcoder.com/acm/contest/119182/A
来源：牛客网

输入描述:

一行两个整数 n,m(max(n,m)≥3,min(n,m)≥2,n×m≤106)n,m(max(n,m)≥3,min(n,m)≥2,n×m≤106) 表示矩阵的行数和列数。

输出描述:

一个 nn 行 mm 列的矩阵，表示你构造的矩阵，矩阵元素必须是'1'、'4'、'5'之一，或输出 "heng heng heng, aaaa~" 表示无解。

示例1
输入
复制

2 3

输出
复制

1 1 4
5 1 4

示例2
输入
复制

5 2

输出
复制

1 1
4 5
1 4
1 1
4 5
 */
#include <stdio.h>

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    if (n < m) {
        int t = n;
        n = m;
        m = t;
    }
    if (m == 2) {
        if (n % 3 == 0) {
            for (int i = 0; i < n / 3; i++) {
                printf("1 1\n4 5\n1 4\n");
            }
        } else if (n % 3 == 1) {
            if (n == 1) {
                printf("heng heng heng, aaaa~\n");
            } else {
                for (int i = 0; i < n / 3 - 1; i++) {
                    printf("1 1\n4 5\n1 4\n");
                }
                printf("5 1\n4 5\n1 4\n");
            }
        } else {
            for (int i = 0; i < n / 3; i++) {
                printf("1 1\n4 5\n1 4\n");
            }
            printf("5 1\n4 5\n");
        }
    } else if (m == 3) {
        if (n % 2 == 0) {
            for (int i = 0; i < n / 2; i++) {
                printf("1 1 4\n5 1 4\n");
            }
        } else {
            if (n == 1) {
                printf("heng heng heng, aaaa~\n");
            } else {
                for (int i = 0; i < n / 2 - 1; i++) {
                    printf("1 1 4\n5 1 4\n");
                }
                printf("5 1 4\n5 1 4\n");
            }
        }
    } else {
        printf("heng heng heng, aaaa~\n");
    }
    return 0;
}